# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs -o - %s | FileCheck %s

---
name: v2s16_trunc_same_bitcast_lshr16
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0
    ; CHECK-LABEL: name: v2s16_trunc_same_bitcast_lshr16
    ; CHECK: liveins: $vgpr0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s16>) = COPY $vgpr0
    ; CHECK-NEXT: $vgpr0 = COPY %src(<2 x s16>)
    %src:_(<2 x s16>) = COPY $vgpr0
    %bitcast:_(s32) = G_BITCAST %src
    %lshr_amount:_(s32) = G_CONSTANT i32 16
    %lshr:_(s32) = G_LSHR %bitcast, %lshr_amount
    %root:_(<2 x s16>) = G_BUILD_VECTOR_TRUNC %bitcast, %lshr
    $vgpr0 = COPY %root
...

---
name: v2s16_trunc_different_bitcast_lshr16
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0
    ; CHECK-LABEL: name: v2s16_trunc_different_bitcast_lshr16
    ; CHECK: liveins: $vgpr0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s16>) = COPY $vgpr0
    ; CHECK-NEXT: $vgpr0 = COPY %src(<2 x s16>)
    %src:_(<2 x s16>) = COPY $vgpr0
    %bitcast0:_(s32) = G_BITCAST %src
    %bitcast1:_(s32) = G_BITCAST %src
    %lshr_amount:_(s32) = G_CONSTANT i32 16
    %lshr:_(s32) = G_LSHR %bitcast1, %lshr_amount
    %root:_(<2 x s16>) = G_BUILD_VECTOR_TRUNC %bitcast0, %lshr
    $vgpr0 = COPY %root
...

---
name: v2s16_trunc_same_bitcast_lshr8_nocombine
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0
    ; CHECK-LABEL: name: v2s16_trunc_same_bitcast_lshr8_nocombine
    ; CHECK: liveins: $vgpr0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s16>) = COPY $vgpr0
    ; CHECK-NEXT: %bitcast:_(s32) = G_BITCAST %src(<2 x s16>)
    ; CHECK-NEXT: %lshr_amount:_(s32) = G_CONSTANT i32 8
    ; CHECK-NEXT: %lshr:_(s32) = G_LSHR %bitcast, %lshr_amount(s32)
    ; CHECK-NEXT: %root:_(<2 x s16>) = G_BUILD_VECTOR_TRUNC %bitcast(s32), %lshr(s32)
    ; CHECK-NEXT: $vgpr0 = COPY %root(<2 x s16>)
    %src:_(<2 x s16>) = COPY $vgpr0
    %bitcast:_(s32) = G_BITCAST %src
    %lshr_amount:_(s32) = G_CONSTANT i32 8
    %lshr:_(s32) = G_LSHR %bitcast, %lshr_amount
    %root:_(<2 x s16>) = G_BUILD_VECTOR_TRUNC %bitcast, %lshr
    $vgpr0 = COPY %root
...

---
name: v2s16_same_bitcast_lshr16
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0
    ; CHECK-LABEL: name: v2s16_same_bitcast_lshr16
    ; CHECK: liveins: $vgpr0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s16>) = COPY $vgpr0
    ; CHECK-NEXT: $vgpr0 = COPY %src(<2 x s16>)
    %src:_(<2 x s16>) = COPY $vgpr0
    %bitcast:_(s32) = G_BITCAST %src
    %lshr_amount:_(s32) = G_CONSTANT i32 16
    %lshr:_(s32) = G_LSHR %bitcast, %lshr_amount
    %trunclo:_(s16) = G_TRUNC %bitcast
    %trunchi:_(s16) = G_TRUNC %lshr
    %root:_(<2 x s16>) = G_BUILD_VECTOR %trunclo, %trunchi
    $vgpr0 = COPY %root
...

---
name: v2s16_same_bitcast_lshr8_nocombine
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0
    ; CHECK-LABEL: name: v2s16_same_bitcast_lshr8_nocombine
    ; CHECK: liveins: $vgpr0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s16>) = COPY $vgpr0
    ; CHECK-NEXT: %bitcast:_(s32) = G_BITCAST %src(<2 x s16>)
    ; CHECK-NEXT: %lshr_amount:_(s32) = G_CONSTANT i32 8
    ; CHECK-NEXT: %lshr:_(s32) = G_LSHR %bitcast, %lshr_amount(s32)
    ; CHECK-NEXT: %trunclo:_(s16) = G_TRUNC %bitcast(s32)
    ; CHECK-NEXT: %trunchi:_(s16) = G_TRUNC %lshr(s32)
    ; CHECK-NEXT: %root:_(<2 x s16>) = G_BUILD_VECTOR %trunclo(s16), %trunchi(s16)
    ; CHECK-NEXT: $vgpr0 = COPY %root(<2 x s16>)
    %src:_(<2 x s16>) = COPY $vgpr0
    %bitcast:_(s32) = G_BITCAST %src
    %lshr_amount:_(s32) = G_CONSTANT i32 8
    %lshr:_(s32) = G_LSHR %bitcast, %lshr_amount
    %trunclo:_(s16) = G_TRUNC %bitcast
    %trunchi:_(s16) = G_TRUNC %lshr
    %root:_(<2 x s16>) = G_BUILD_VECTOR %trunclo, %trunchi
    $vgpr0 = COPY %root
...

---
name: v2s16_undefhi
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0
    ; CHECK-LABEL: name: v2s16_undefhi
    ; CHECK: liveins: $vgpr0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s16>) = COPY $vgpr0
    ; CHECK-NEXT: $vgpr0 = COPY %src(<2 x s16>)
    %src:_(<2 x s16>) = COPY $vgpr0
    %bitcast:_(s32) = G_BITCAST %src
    %trunc:_(s16) = G_TRUNC %bitcast
    %undef:_(s16) = G_IMPLICIT_DEF
    %root:_(<2 x s16>) = G_BUILD_VECTOR %trunc, %undef
    $vgpr0 = COPY %root
...

---
name: v2s32_undefhi
tracksRegLiveness: true
legalized: true
body: |
  bb.0:
    liveins: $vgpr0_vgpr1
    ; CHECK-LABEL: name: v2s32_undefhi
    ; CHECK: liveins: $vgpr0_vgpr1
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: %src:_(<2 x s32>) = COPY $vgpr0_vgpr1
    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY %src(<2 x s32>)
    %src:_(<2 x s32>) = COPY $vgpr0_vgpr1
    %bitcast:_(s64) = G_BITCAST %src
    %trunc:_(s32) = G_TRUNC %bitcast
    %undef:_(s32) = G_IMPLICIT_DEF
    %root:_(<2 x s32>) = G_BUILD_VECTOR %trunc, %undef
    $vgpr0_vgpr1 = COPY %root
...
